﻿var app = {

    // tablePrimaryKey="Id",//设置默认主键Id
    /**
     *  Index 页面初始化
     */
    indexInit: function () {
        var $ = layui.jquery;

        ////注册layui-btn 事件
        //$('.layui-btn').on('click', function () {
        //    var type = $(this).data('type');
        //    active[type] ? active[type].call(this) : '';
        //});
        // $("#search").click();//初始化完成后 搜索一次
        //重置搜索条件
        $("#reset").on("click", function () {
            setTimeout(function () {
                $("#search").click();
            }, 300);
        });
    },
    /*
     * Info页面 初始化
     * */
    infoInit: function () {
        let $ = layui.jquery;
        $(".closewindow").on('click', function () {
            //当你在iframe页面关闭自身时
            var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
            parent.layer.close(index); //再执行关闭
        });
        $(".refreshwindow").on('click', function () {
            //window.location = window.location.href; /* 获取完整URL */
            location.reload();
        });
    },
    /**
     *  初始化表格Plug
     * @param {any} tableid  //table ID
     * @param {any} cols   //表格列 array
     */
    initTablePlug: function LoadTable(tableid, cols, options) {
        let table = layui.table;
        /**
         * layui table 修改。
         *  layui.define(['laytpl', 'laypage', 'layer', 'form', 'util'], function(exports){
            "use strict";
            // 此处省略了很多内容，主要看下面的代码
        
            // 把thisTable和Class透漏出去，方便拓展
            table.thisTable = thisTable;
            table.Class = Class;
        
            //自动完成渲染
            table.init();
        
            exports(MOD_NAME, table);
          });
         */

        var $ = layui.jquery;
        //Table 初始化
        table.render({
            id: tableid,
            elem: '#' + tableid,

            cols: cols,
            data: [], //直接赋值数据
            title: options.title ? options.title : tableid, //定义 table 的大标题（在文件导出等地方会用到）
            text: options.text ? options.text : {
                none: '无数据'
            }, //自定义文本，如空数据时的异常提示等
            url: options.url ? options.url : null, //异步数据接口相关参数。其中 url 参数为必填项
            page: options.page ? options.page : true, //开启分页（ 默认： false）
            cellMinWidth: options.cellMinWidth ? options.cellMinWidth : 90, //全局定义所有常规单元格的最小宽度（默认：60），一般用于列宽自动分配的情况。其优先级低于表头参数中的 minWidth
            height: options.height ? options.height : null, //设定容器高度
            totalRow: options.totalRow ? options.totalRow : false, //是否开启合计行区域
            skin: options.skin ? options.skin : null, //设定表格各种外观、尺寸等
            toolbar: options.toolbar ? options.toolbar : '#toolbar', //开启表格头部工具栏区域，该参数支持四种类型值：
            limit: options.limit ? options.limit : 15, //每页显示的条数（默认：10）
            limits: options.limits ? options.limits : [15, 25, 50, 80, 100], //每页条数的选择项，默认：[10,20,30,40,50,60,70,80,90]。
            size: options.size ? options.size : 'sm', //设定表格尺寸 sm 小尺寸、lg 大尺寸
            defaultToolbar: options.defaultToolbar ? options.defaultToolbar : [{
                layEvent: 'refresh',
                icon: 'layui-icon-refresh',
            }, 'filter', 'print', 'exports'],
            loading: options.loading ? options.loading : true, //是否显示加载条（默认：true）
            autoSort: options.autoSort ? options.autoSort : false, //默认 true，即直接由 table 组件在前端自动处理排序
            /* initSort: options.initSort ? options.initSort : {},*/ //初始排序状态。用于在数据表格渲染完毕时，默认按某个字段排序。

            even: options.even ? options.even : true, //开启隔行背景
            // 是否开启字段筛选的记忆功能，支持true/false/'local'/'session'/其他 开启的情况下默认是session，除非显式的指定为'local'
            colFilterRecord: options.colFilterRecord ? options.colFilterRecord : true,
            // 开启智能重载
            smartReloadModel: options.smartReloadModel ? options.smartReloadModel : true,
            // 默认反转
            // , reversal: true
            // 设置开启部分选项不可选
            // 设置表格的主键（主要用在记录选中状态还有不可操作记录的时候用
            primaryKey: options.primaryKey ? options.primaryKey : 'Id',
            checkDisabled: options.checkDisabled ? options.checkDisabled : {
                enabled: true,
                //data: [10000, 10001, 10002, 10003, 10004, 10005, 10009]
            },
            // , pageLanguage: 'zh-TW' // 需要自己定义对应的文本
            // , pageLanguage: 'en' // tablePlug里面已经定义了，如果觉得不满意可以用tablePlug.set去更新默认的配置;
            // , pageLanguage: true // 无效的设置方式，只支持字符串或者对象的
            // 也可以针对某个表格有特殊的配置如下面对象的设置方法,但是如果没有必要单独的自定义建议使用直接赋值成语言名称的字符串形式
            // pageLanguage = options.pageLanguage ? options.pageLanguage : true,
            done: function (res, curr, count) {
                if (options.done != null || options.done != undefined) {
                    options.done(res, curr, count);
                }
            },
            checkStatus: options.checkStatus ? options.checkStatus : {} //默认选中数据
            // , autoSort: false
            // , initSort: {
            //   field: 'id' //排序字段，对应 cols 设定的各字段名
            //   , type: 'asc' //排序方式  asc: 升序、desc: 降序、null: 默认排序
            // }

        });
        options.tablePlug.enableTableFixedScroll(false);
        //});
    },

    /**
     *  初始化表格 Pear Table
     * @param {any} table  //table 对象
     * @param {any} tableid  //table ID
     * @param {any} cols   //表格列 array
     * @param {any} options   //其它可选参数
     * 与layui参数基本一致
     * options:{title:title,page:true,totalRow:false,limit:15,size:'sm',done:完成后调用的方法}
     */
    initTable: function (tableid, cols, options) {
        // title, size, skin, limit, limits, toolbarid, page
        let table = layui.table;
        //size = size ? size : 'sm';
        //skin = skin ? skin : 'line';
        var $ = layui.jquery;
        //https://www.layui.com/doc/modules/table.html
        table.render({
            elem: '#' + tableid,
            cols: cols,
            data: [], //直接赋值数据
            title: options.title ? options.title : tableid, //定义 table 的大标题（在文件导出等地方会用到）
            text: options.text ? options.text : {
                none: '无数据'
            }, //自定义文本，如空数据时的异常提示等
            url: options.url ? options.url : null, //异步数据接口相关参数。其中 url 参数为必填项
            page: options.page ? options.page : true, //开启分页（ 默认： false）
            cellMinWidth: options.cellMinWidth ? options.cellMinWidth : 90, //全局定义所有常规单元格的最小宽度（默认：60），一般用于列宽自动分配的情况。其优先级低于表头参数中的 minWidth
            height: options.height ? options.height : null, //设定容器高度
            totalRow: options.totalRow ? options.totalRow : false, //是否开启合计行区域
            skin: options.skin ? options.skin : null, //设定表格各种外观、尺寸等
            toolbar: options.toolbar ? options.toolbar : '#toolbar', //开启表格头部工具栏区域，该参数支持四种类型值：
            limit: options.limit ? options.limit : 15, //每页显示的条数（默认：10）
            limits: options.limits ? options.limits : [15, 25, 50, 80, 100], //每页条数的选择项，默认：[10,20,30,40,50,60,70,80,90]。
            size: options.size ? options.size : 'sm', //设定表格尺寸 sm 小尺寸、lg 大尺寸
            defaultToolbar: options.defaultToolbar ? options.defaultToolbar : [{
                layEvent: 'refresh',
                icon: 'layui-icon-refresh',
            }, 'filter', 'print', 'exports'],
            loading: options.loading ? options.loading : true, //是否显示加载条（默认：true）
            autoSort: options.autoSort ? options.autoSort : false, //默认 true，即直接由 table 组件在前端自动处理排序
            /* initSort: options.initSort ? options.initSort : {},*/ //初始排序状态。用于在数据表格渲染完毕时，默认按某个字段排序。

            even: options.even ? options.even : true, //开启隔行背景
            done: options.done,
            //done: function(res, curr, count) {
            //    if (options.done != null || options.done != undefined) {
            //        options.done(res, curr, count);
            //    }
            //}
        });
    },
    /**
     *  初始化表格 treetable
     * @param {any} treetable  //treetable 对象
     * @param {any} tableid  //table ID
     * @param {any} cols   //表格列 array
     * @param {any} options   //其它可选参数
     * 与layui参数基本一致
     */
    treetable: function (tableid, cols, options) {
        let treetable = layui.treetable;
        treetable.render({
            treeColIndex: options.treeColIndex ? options.treeColIndex : 1,
            treeSpid: options.treeSpid ? options.treeSpid : 0,
            treeIdName: options.treeIdName ? options.treeIdName : "Id", //'powerId',
            treePidName: options.treePidName ? options.treePidName : "Pid", //'parentId',
            skin: options.skin ? options.skin : 'line',
            method: options.method ? options.method : 'post',
            treeDefaultClose: options.treeDefaultClose ? options.treeDefaultClose : true,
            toolbar: options.toolbar ? options.toolbar : '#toolbar',
            elem: '#' + tableid,
            url: options.url, //'../../admin/data/power.json',
            page: options.page ? options.page : false,
            cols: cols
        });
    },
    /**
     *  初始化表格 treeTable
     * @param {any} treetable  //treetable 对象
     * @param {any} tableid  //table ID
     * @param {any} cols   //表格列 array
     * @param {any} options   //其它可选参数
     * 与layui参数基本一致
     */
    treetable3: function (tableid, cols, options) {
        let treetable = layui.treeTable;
        options = options ? options : {};
        var insTb = treetable.render({
            elem: '#' + tableid,
            url: options.url ? options.url : undefined, //url方式加载数据

            data: options.data ? options.data : undefined, //直接赋值数据
            width: options.width ? options.width : undefined, //设定容器宽度
            height: options.height ? options.height : undefined, //设定容器高度
            cellMinWidth: options.cellMinWidth ? options.cellMinWidth : undefined, //定义所有单元格的最小宽度
            text: options.text ? options.text : undefined, //自定义文本，如空数据提示等
            skin: options.skin ? options.skin : undefined, //设定表格风格 line行边框、row列边框、nob无边框
            even: options.even ? options.even : undefined, //开启隔行背景
            size: options.size ? options.size : 'sm', //设定表格尺寸 sm 小尺寸、lg 大尺寸
            useAdmin: options.useAdmin ? options.useAdmin : true, //url方式加载数据是否使用admin.ajax方法
            method: options.method ? options.method : 'post', //url方式加载数据的请求方式
            where: options.where ? options.where : undefined, //url方式加载数据的请求参数
            contentType: options.contentType ? options.contentType : undefined, //url方式加载数据的参数类型
            headers: options.headers ? options.headers : undefined, //url方式加载数据的请求头
            done: options.done ? options.done : undefined, //表格渲染完回调
            title: options.title ? options.title : undefined, //自定义table大标题，文件导出会用到

            toolbar: options.toolbar ? options.toolbar : 'default', //自定义头部工具栏
            height: options.height ? options.height : 'full-200',
            tree: options.tree ? options.tree : {
                arrowType: "arrow2",
                getIcon: "",
                iconIndex: 1,
                isPidData: true,
                idName: 'Id',
                pidName: 'ParentId'
            },
            defaultToolbar: options.defaultToolbar ? options.defaultToolbar : [{
                layEvent: 'refresh',
                icon: 'layui-icon-refresh',
            }, 'filter', 'exports'], //自定义头部工具栏右侧按钮
            cols: cols,
            style: options.style ? options.style : 'margin-top:0;', //设定容器的样式
            reqData: options.reqData ? options.reqData : null,
            //reqData: function (data, callback) {
            //    // 在这里写ajax请求，通过callback方法回调数据
            //    $.post('@(Url.Action("GetList"))',
            //        {
            //            Code: $("#Code").val(),
            //            KeyWords: $("#KeyWords").val(),
            //        },
            //        function (res) {
            //            if (res.code == 0) callback(res.data);
            //            else callback(res.msg);
            //        });
            //}
        });

        return insTb;
    },
    /**
     * 搜索
     * @param {any} table  // table 对象
     * @param {any} url  //提交地址
     * @param {any} query  //提交数据
     * @param {any} tableid  //table ID
     * @param {any} options   //其它可选参数
     */
    search: function (tableid, url, searchQuery, options) {
        table = layui.table;
        tableid = tableid ? tableid : 'listData';
        options = options ? options : {};
        var $ = layui.jquery;
        table.reload(tableid, {
            url: url,
            page: {
                curr: options.curr ? options.curr : 1 //重新从第 1 页开始
            },
            method: options.method ? options.method : "POST", //如果无需自定义HTTP类型，可不加该参数
            where: searchQuery ? searchQuery : {}, //设定异步数据接口的额外参数
            done: function (res, curr, count) {
                if (options.done != null || options.done != undefined) {
                    options.done(res, curr, count);
                }
            },
        });
    },
    // /**
    //  * plugTable 用的
    //  *  处理返回的表格数据
    //  * @param {any} res  //数据源
    //  */
    // handleTableData: function(res) {
    //     for (var index in res.data) {
    //         for (var item2 in res.data[index]) {
    //             //var a=item2;
    //             if (res.data[index][item2] == "0001-01-01 00:00:00") {
    //                 res.data[index][item2] = "";
    //             }
    //             if (res.data[index][item2] === true) {
    //                 res.data[index][item2 + 'Name'] = "是";
    //             } else if (res.data[index][item2] === false) {
    //                 res.data[index][item2 + 'Name'] = "否";
    //             }
    //         }
    //     }
    // },
    /**
     *  获取Table选中的数据 Id
     * @param {any} table //table 对象
     * @param {any} tableid  //tableID
     */
    getSelectDataIds: function (table, tableid) {
        //let table = layui.table;
        tableid = tableid ? tableid : 'listData'
        var $ = layui.jquery;
        var checkStatus = table.checkStatus(tableid),
            data = checkStatus.data;
        var ids = "";
        $.each(data, function (index, item) {
            ids += +item.Id + ",";
        });
        ids = ids.substr(0, ids.length - 1);
        return ids;
    },
    /**
     *  initDate 初始化 时间
     * @param {any} dates //日期 input id字符串
     * @param {any} type //类型 年(year),月（month），日(不传就是)，时间（time）,时间范围（datetime）
     * @param {any} range  //range: true //或 range: '~' 来自定义分割字符
     */
    initDate: function (dates, type, range, format) {
        //var arrDateEle = 'LastLoginTime,LastRechargeTime,CreationTime,UpdateTime,DeletedTime'.split(',');
        if (dates === undefined || dates === '' || dates === null) return;
        let laydate = layui.laydate;
        type = type ? type : ''; //为空表示 选择为：日
        range = range ? range : false;
        format = format ? format : 'yyyy-MM-dd';
        /*  layui.use('laydate', function() {*/
        var arrDateEle = dates.split(',');
        for (var i = 0; i < arrDateEle.length; i++) {
            if (type === undefined || type === '' || type === null) {
                laydate.render({
                    elem: '#' + arrDateEle[i],
                    format: format, // "yyyy-MM-dd HH:mm:ss"
                    range: range
                });
            } else {
                laydate.render({
                    elem: '#' + arrDateEle[i],
                    type: type, //datetime
                    format: format, // "yyyy-MM-dd HH:mm:ss"
                    range: range
                });
            }

        }
        /* });*/
    },
    /**
     *  Post 数据
     *  必须参数：url、data
     *  回调方法：success:window.refresh、fail:失败调用方法
     *  弹框消息 isMsg:true、successMsg:"操作成功"、failMsg:"操作失败"
     */
    post: function (options) {

        let $ = layui.jquery;
        let layer = layui.layer;
        let loading = layer.load();
        $.post(options.url, options.data, function (result) {
            layer.close(loading);
            if (result.Succeeded) {
                if (options.success != null && options.success != undefined) {
                    options.success();
                }
            } else {
                if (options.fail != null && options.fail != undefined) {
                    options.fail();
                }
            }
            app.tipMsg({ succeeded: result.Succeeded, errors: result.Errors, successMsg: options.successMsg, failMsg: result.failMsg });
        }).fail(function (response) {
            layer.close(loading);
            console.log(response.responseText);
            //alert('Error: ' + response.responseText);
            app.failure('提交失败');
        });
    },
    /**
     *  Post 数据
     * {url:url,data:data,success:window.refresh,fail:失败调用方法}
     */
    ajax: function (options) {
        let $ = layui.jquery;
        let layer = layui.layer;
        let loading = layer.load();
        $.ajax({
            type: "POST",
            url: options.url,
            contentType: "application/json", //如果提交的是json数据类型，则必须有此参数,表示提交的数据类型 
            //dataType: "json", //表示返回值类型，不必须           
            data: options.data,
            success: function (result) {
                layer.close(loading);
                //在原来的页面跳转到下载word模板的页面
                // window.location.href = "/InviteBid/ExportTemplateFile";
                if (result.Succeeded) {
                    if (options.success != null && options.success != undefined) {
                        options.success();
                    }
                } else {
                    if (options.fail != null && options.fail != undefined) {
                        options.fail();
                    }
                }
                app.tipMsg({ succeeded: result.Succeeded, errors: result.Errors, successMsg: options.successMsg, failMsg: options.failMsg });
            },
            error: function (data) {
                layer.close(loading);
                // alert("下载模板失败！");
                console.log(data);
                app.failure('提交失败')
            }
        });
    },
    /**
     *  Post 数据
     * @param {any} url //提交地址
     * @param {any} data  //提交数据
     * @param {any} surmsg  //提交确认消息
     * @param {any} success   //成功回调方法
     * @param {any} fail  //失败回调方法
     * @param {any} successmsg //成功弹框消息
     * @param {any} failmsg //失败弹框消息
     * {url:url,data:data,title:'请确认',surmsg:'确认要提交吗？',success:成功后执行方法,fail:失败后执行方法}
     */
    confirm: function (options) {
        //url, data, surmsg, title = '请确认', table, isrefresh = true, tableid = 'listData'
        options.title = options.title ? options.title : '警告，请确认';
        //options.isrefresh = options.isrefresh ? options.isrefresh : true;//成功后是否刷新

        var $ = layui.jquery;
        layer = layui.layer;
        layer.confirm(options.surmsg, {
            icon: 3, //警告
            title: options.title
        }, function (index) {
            layer.close(index);
            let loading = layer.load(); //开始动画
            $.post(options.url, options.data, function (result) {
                layer.close(loading); //停止动画
                if (result.Succeeded) {
                    if (options.success != null && options.success != undefined) {
                        options.success();
                    }

                } else {
                    if (options.fail != null && options.fail != undefined) {
                        options.fail();
                    }
                }
                app.tipMsg({ succeeded: result.Succeeded, errors: result.Errors, successMsg: options.successMsg, failMsg: options.failMsg });
            }).fail(function (response) {
                layer.close(loading);
                console.log(response.responseText);
                //alert('Error: ' + response.responseText);
                app.failure('提交失败');
            });
        });
    },
    /**
     * layui 打开窗口
     * 常用参数：{ title:'新增', url:'@(Url.Action("Info"))', area:['600px', '700px'], end:完成后调用方法 }
     */
    open: function (options) {
        //title, url, area, tableid, table
        //tableid = tableid ? tableid : "listData";
        layer = layui.layer;
        layer.open({
            type: 2, //0（信息框，默认）1（页面层）2（iframe层）3（加载层）4（tips层）
            area: options.area ? options.area : ['100%', '100%'],
            title: options.title, //弹框标题
            content: options.url, //内容
            shadeClose: options.shadeClose ? options.shadeClose : true, //是否点击遮罩关闭
            shade: options.shade ? options.shade : [0.9, '#2a2c2d54'], //shade - 默认是0.3透明度的黑色背景（'#000'）。如果你想定义别的颜色，可以shade: [0.8, '#393D49']；如果你不想显示遮罩，可以shade: 0
            maxmin: options.maxmin ? options.maxmin : true, //开启最大化最小化按钮
            btnAlign: options.btnAlign ? options.btnAlign : 'c', //按钮排列  左 l 中 c 右 r
            resize: options.resize ? options.resize : true, //是否允许拉伸,默认 true
            yes: options.yes ? options.yes : function (index) {
                layer.close(index);
            },
            end: options.end ? options.end : function () {
                if (options.end != null && options.end != undefined) {
                    options.end(); //
                }
            },
            success: options.success ? options.success : function (layero, index) {
                console.log(layero, index);
            }
        });
    },
    /**
     * 删除操作
     * {url:url,data:data,success:obj,fail:失败方法,surmsg:"确认要删除吗！！请谨慎操作"}
     */
    delete: function (options) {
        let $ = layui.jquery;
        let layer = layui.layer;
        options.surmsg = options.surmsg ? options.surmsg : "确认要删除吗！！请谨慎操作";

        layer.confirm(options.surmsg, {
            icon: 3,
            title: '警告'
        }, function (index) {
            layer.close(index);
            let loading = layer.load();
            $.post(options.url, options.data ? options.data : {}, function (result) {
                layer.close(loading);
                if (result.Succeeded) {

                    if (options.success != null && options.success != undefined) {
                        options.success();
                    }
                } else {
                    if (options.fail != null && options.fail != undefined) {
                        options.fail();
                    }
                }
                app.tipMsg({ succeeded: result.Succeeded, errors: result.Errors, successMsg: options.successMsg, failMsg: options.failMsg });
            }).fail(function (response) {
                layer.close(loading);
                console.log(response.responseText);
                //alert('Error: ' + response.responseText);
                app.failure('提交失败');
            });

        });
    },
    /**
     * 图片上传
     * @param {any} upload //upload 对象
     * @param {any} uploadUrl //上传url地址
     * @param {any} elem   //上传按钮 id
     * @param {any} inputImgId //input img的id
     * @param {any} imgSrcId  //img src id
     */
    initFileUpLoad: function (options) {
        //upload, uploadUrl, elem, inputImgId, imgSrcId
        options.accept = options.accept ? options.accept : "file";
        var $ = layui.jquery;
        layer = layui.layer;
        let upload = layui.upload;
        var loading;
        upload.render({
            elem: '#' + options.elem // '#btn_img_upload'

            ,
            url: options.url //'@(Url.Action("ImgUpload"))?type=Rotation'
            // , field: "fileNames"     //添加这个属性与后台名称保存一致

            ,
            accept: 'file' //普通文件
            ,
            headers: options.headers //接口的请求头。如：headers: {token: 'sasasas'}
            //acceptMime: 'image/*'（只显示图片文件）
            //acceptMime: 'image/jpg, image/png'（只显示 jpg 和 png 文件）
            ,
            acceptMime: options.acceptMime //
            ,
            exts: options.exts //'zip|rar|7z' 即代表只允许上传压缩格式的文件
            ,
            auto: options.auto ? options.auto : true //
            ,
            bindAction: options.bindAction //指向一个按钮触发上传，一般配合 auto: false 来使用。值为选择器或DOM对象，如：bindAction: '#btn'
            ,
            field: options.field //设定文件域的字段名
            ,
            size: options.size ? options.size : 0 //设置文件最大可允许上传的大小，单位 KB。不支持ie8/9  ,0表示不限制
            ,
            multiple: options.multiple ? options.multiple : 0 //是否允许多文件上传。设置 true即可开启 
            ,
            number: options.number ? options.number : 0 //设置同时可上传的文件数量，一般配合 multiple 参数出现 , 0表示不限制
            ,
            drag: options.drag ? options.drag : true //是否接受拖拽的文件上传，设置 false 可禁用。不支持ie8/9 ,默认true
            ,
            choose: options.choose //选择文件后的回调函数。返回一个object参数

            ,
            before: function (obj) { //obj参数包含的信息，跟 choose回调完全一致，可参见上文。
                loading = layer.load(); //上传loading
                if (options.before != undefined && options.before != null) {
                    options.before(obj);
                }
            },
            //返回三个参数，分别为：res（服务端响应信息）、index（当前文件的索引）、upload（重新上传的方法，一般在文件上传失败后使用）
            done: function (res, index, upload) {
                layer.closeAll('loading'); //关闭loading
                app.tipMsg({ succeeded: res.Succeeded, errors: res.Errors, successMsg: "上传成功", failMsg: "删除失败" });
                if (options.done != undefined && options.done != null) {
                    options.done(res, index, upload);
                }
            },
            //error: options.error,
            //done: function (res) {
            //    //$("#Image").val(res.data.src);
            //    // $("#upload_img").attr('src', res.data.httpsrc);
            //    $('#' + inputImgId).val(res.data.src);
            //    $('#' + imgSrcId).attr('src', res.data.httpsrc);
            //    console.log(res);
            //    layer.closeAll('loading'); //关闭loading
            //    app.success("上传成功");
            //},
            error: function (index, upload) {
                layer.closeAll('loading'); //关闭loading
                app.failure('上传失败');

                if (options.error != undefined && options.error != null) {
                    options.error(index, upload);
                }
            }
        });
    },
    /**
     *  CkEditor 初始化
     * @param {any} elemName //对象名字（id）
     */
    ckeditorInit: function (elemName) {
        //editorElement = CKEDITOR.document.getById('Content');
        //CKEDITOR.replace('Content');
        editorElement = CKEDITOR.document.getById(elemName);
        CKEDITOR.replace(elemName);
    },
    /**
     * CkEditor 获取数据
     * @param {any} elemName //对象名字（id）
     */
    ckeditorGetData: function (elemName) {
        return CKEDITOR.instances[elemName].getData();
    },
    //adminHomeRender: function () {
    //    body.on("click", ".refreshcache", function () {
    //        // 回调
    //        var result = logout();
    //        if (result) {
    //            // 清空缓存
    //            bodyTab.clear();
    //        }
    //    })
    //},
    refreshCache: function (options) {
        app.post({ url: options.url, data: {} });
    },
    login: function (options) {
        //field, resulturl,logindone
        let $ = layui.jquery;
        let layer = layui.layer;
        let loading = layer.load();
        $.post(options.url, options.data, function (result) {
            layer.close(loading);
            if (options.logindone != undefined && options.logindone != null) {
                options.logindone(result);
            }
            if (result.Succeeded) {
                ocation = options.returnurl;
                setTimeout(function () {
                    location = options.returnurl;
                }, 1500);
            }
            app.tipMsg({ succeeded: result.Succeeded, errors: result.Errors, successMsg: "登陆成功！", failMsg: "登陆失败！" });
        }).fail(function (response) {
            layer.close(loading);
            app.failMsg('登陆失败，请稍后再试！');
        });

    },
    /**
     * 提示消息
     * succeeded 成功状态：true、false
     * errors 错误消息：字符串或对象
     * successMsg 成功消息
     * failMsg 失败消息
     * @param {any} options// {succeeded,successMsg,failMsg}
     */
    tipMsg: function (options) {
        if (options.succeeded) {
            options.successMsg = options.successMsg ? options.successMsg : '操作成功';
            app.success(options.successMsg);
        } else {
            options.failMsg = options.failMsg ? options.failMsg : '操作失败';
            if (options.errors != undefined && options.errors != null && options.errors != '')
                options.failMsg = options.errors ? options.errors : options.failMsg;
            app.failure(options.failMsg);
        }
    },
    /**
     * 成功消息
     * @param {any} content  //消息内容
     * */
    success: function (content) {
        layer.msg(app.getMsg(content), {
            icon: 1,
            time: 2000
        });
    },
    /**
     * 失败消息
     * @param {any} content  //消息内容
     * */
    failure: function (content) {
        layer.msg(app.getMsg(content), {
            icon: 2,
            time: 2000
        });
    },
    /**
     * 警告消息
     * @param {any} content  //消息内容
     * */
    warning: function (content) {
        layer.msg(app.getMsg(content), {
            icon: 3,
            time: 2000
        });
    },
    /**
     * 获取消息（解析消息，对象转换为字符串）
     * @param {any} obj
     */
    getMsg: function (obj) {
        var msg = "";
        if (obj === null) return "</br>";
        var datatype = app.getDataType(obj);
        if (datatype === 'object') {
            msg = app.objectToString2(obj);
        } else if (datatype === 'string') {
            msg = obj;
        } else {
            msg = obj;
        }
        return msg;
    },
    /**
     * 获取数据类型 'string'|'number'|'bigint'|'boolean'|'symbol'|'undefined'|'object'|'function'
     * @param {any} obj
     */
    getDataType: function (obj) {
        return typeof obj;
    },
    /**
     * 对象转换为字符串（含字段属性名）
     * @param {any} arr
     */
    objectToString: function (arr) {
        var str = "";
        for (var datafield in arr) {
            str += datafield + ":" + arr[datafield] + "</br>";
        }
        //$(arr).each(function (index, item) {
        //    var a = item;
        //});
        return str;
    },
    /**
     * 对象转换为字符串
     * @param {any} arr
     */
    objectToString2: function (arr) {
        var str = "";
        for (var datafield in arr) {
            str += arr[datafield] + "</br>";
        }
        //$(arr).each(function (index, item) {
        //    var a = item;
        //});
        return str;
    },
    /**
     * 获取当前时间
     * 使用格式 ：年：yyyy月：MM日：dd时：hh分：mm秒：ss 毫秒：S
     * @param {any} format
     */
    getNowTime: function (format) {
        format = format ? format : "yyyy-MM-dd hh:mm:ss";
        var date = new Date();
        return date.Format(format);
    },
    /**
     * tinymce 初始化
     * @param {any} options
     */
    tinymceInit: function (options) {
        var tinymce = layui.tinymce;
        //tinymce 文档 http://tinymce.ax-z.cn/plugins/autoresize.php
        var uploaditem = tinymce.render({
            elem: "#" + options.elem,
            height: options.height ? options.height : 400,//默认高度
            autoresize_min_height: options.autoresize_min_height ? options.autoresize_min_height : 350,//最小高度
            autoresize_bottom_margin: options.autoresize_bottom_margin ? options.autoresize_bottom_margin : 50,
            //images_upload_url:'@(Url.Action("ImgUpload"))',
            paste_data_images: options.paste_data_images ? options.paste_data_images : true,
            images_file_types: options.images_file_types ? options.images_file_types : 'jpeg,jpg,.png,gif,bmp,webp,gif',
            images_upload_handler: function (blobInfo, success, failure) {
                //将图片转码为base64格式
                success("data:" + blobInfo.blob().type + ";base64," + blobInfo.base64());
            },
            //file_picker_types: '.pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .mp3, .mp4',
            //文件上传
            file_picker_callback: function (callback, value, meta) {
                //文件分类
                var filetype = options.filetype ? options.filetype : '.pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .mp3, .mp4';
                //为不同插件指定文件类型及后端地址
                switch (meta.filetype) {
                    case 'image':
                        filetype = '.jpg, .jpeg, .png, .gif';
                        //upurl = 'upimg.php';
                        break;
                    case 'media':
                        filetype = '.mp3, .mp4';
                        //upurl = 'upfile.php';
                        break;
                    case 'file':
                    default:
                }
                //模拟出一个input用于添加本地文件
                var input = document.createElement('input');
                input.setAttribute('type', 'file');
                input.setAttribute('accept', filetype);
                if (options.multiple != undefined && options.multiple != null && (options.multiple === true || options.multiple === 'multiple')) {
                    input.setAttribute('multiple', 'multiple');
                }
                input.click();
                input.onchange = function () {
                    var file = this.files[0];
                    var xhr, formData;
                    console.log(file.name);
                    xhr = new XMLHttpRequest();
                    xhr.withCredentials = false;
                    xhr.open('POST', options.url);//后端接收上传文件的地址
                    xhr.onload = function () {
                        var json;
                        if (xhr.status != 200) {
                            failure('HTTP Error: ' + xhr.status);
                            return;
                        }
                        json = JSON.parse(xhr.responseText);
                        if (!json || typeof json.Data.src != 'string') {
                            failure('Invalid JSON: ' + xhr.responseText);
                            return;
                        }
                        callback(json.Data.src, { text: file.name, title: file.name });
                    };
                    formData = new FormData();
                    formData.append('file', file, file.name);
                    xhr.send(formData);
                };

            },
        });
        return uploaditem;
    },


}

/*
 * <script src="~/lib/ckeditor4/ckeditor.js"></script>
 * obj.field.Remark = Remark.getContent();
 *
 form.verify({
            Name: function (value) {
                if (value <= 0) {
                    return 'Name不能为空';
                }
            },
            Money: [
                /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
                ,'支付金额错误，最多2位小数，不能以小数点结尾'
            ],
        });
*/
/*
 * <script src="~/lib/ckeditor4/ckeditor.js"></script>
 * obj.field.Remark = Remark.getContent();
 *
 form.verify({
            Name: function (value) {
                if (value <= 0) {
                    return 'Name不能为空';
                }
            },
            Money: [
                /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
                ,'支付金额错误，最多2位小数，不能以小数点结尾'
            ],
        });
*/

/**
 * js正则表达式库--
 * @用法:  Reg.en.test('abc')  ->  true
 * 来源：https://blog.csdn.net/qq_39121810/article/details/107346870
 */

var reg = {
    /*
     * 数字相关
     */
    //正数（可含小数、0）
    posiNum: /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/,

    //正整数
    posiInt: /^[1-9]\d*$/,

    //0或正整数
    posiInt0: /^(0|[1-9][0-9]*)$/,

    //2位的数字
    numLen2: /^[0-9]{2}$/,

    // 2-3位的数字：
    numLen2or3: /^\d{1,3}$/,

    // 非零开头的最多带两位小数的正数：
    posiFloat2: /^([1-9][0-9]*)+(\.[0-9]{1,2})?$/,

    // 带1-2位小数的正数或+负数：
    float1or2: /^(\-)?\d+(.\d{1,2})?$/,

    // 非零的负整数：
    negativeInt: /^-[1-9]\d*$/,

    // 负数或0：
    negative0: /^-[1-9]\d*|0$/,

    // 负整数或0：
    negativeInt0: /^(-[1-9]\d*|0)$/,

    // 负浮点数：
    negativeFloat: /^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$/,

    // 正浮点数：
    posiFloat: /^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$/,

    // 浮点数：
    float: /^(-?\d+)(\.\d+)?$/,


    /*
     * 字符相关
     */


    // 英文和数字：
    numEn: /^[A-Za-z0-9]+$/,

    // 长度为2-4的所有字符：
    en2to4: /^.{2,4}$/,

    // 英文字母：
    En: /^[A-Za-z]+$/,

    // 大写英文字母：
    EN: /^[A-Z]+$/,

    // 小写英文字母：
    en: /^[a-z]+$/,

    // 小写英文字母：
    cn: /^[\u4E00-\u9FA5A]+$/,

    // 数字、字母、下划线
    numEn_: /^\w+$/,

    // 中文、英文、数字、下划线：
    numEnCn_: /^[\u4E00-\u9FA5A-Za-z0-9_]+$/,

    // 中文、英文、数字：
    numEnCn: /^[\u4E00-\u9FA5A-Za-z0-9]+$/,

    // 含有^%&',;=?$\”等字符：
    illegal: /[^%&',;=?$\x22]+/,

    // Email地址：
    email: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,

    // 护照：
    passport: /^1[45][0-9]{7}|G[0-9]{8}|P[0-9]{7}|S[0-9]{7,8}|D[0-9]+$/,

    // 手机号码：
    mobile: /^1[345789]\d{9}$/,

    // 座机号码:
    telephone: /0\d{2,3}-\d{5,9}|0\d{2,3}-\d{5,9}/,

    // 座机或手机号:
    teleMobile: /^((0\d{2,3}-\d{5,9}|0\d{2,3}-\d{5,9})|(1[34578]\d{9}))$/,

    // 身份证号(15位、18位数字)：
    idCard: /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/,

    // 日期： 2017-1-1或2017/1/1
    date: /^\d{4}(-|\/)\d{1,2}(-|\/)\d{1,2}$/,

    // 时间： 10:00:00
    time: /^([01]?\d|2[0-3]):[0-5]?\d:[0-5]?\d$/,

    // 日期+时间： 2017-1-1 10:00:00
    datetime: /^\d{4}(-|\/)\d{1,2}(-|\/)\d{1,2}\s([01]?\d|2[0-3]):[0-5]?\d:[0-5]?\d$/,

    // 一年的12个月(01～09和1～12)：
    month: /^(0?[1-9]|1[0-2])$/,

    // 一个月的31天(01～09和1～31)：
    day: /^((0?[1-9])|((1|2)[0-9])|30|31)$/,

    //腾讯QQ号：
    qq: /[1-9][0-9]{4,}/,

    //中国邮政编码：
    postcode: /[1-9]\d{5}(?!\d)/,

    //IP地址：
    ip: /\d+\.\d+\.\d+\.\d+/,

    //域名：
    url: /^(?=^.{3,255}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/\w+\.\w+)*([\?&]\w+=\w*)*/,

    //域名(http开头):
    urlHttp: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/,

    // 车牌:
    licencePlate: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/,

    //银行卡：
    bankCardNum: /^([1-9]{1})(\d{15}|\d{18})$/,


    //价格：
    price: /(^[1-9]\d*(\.\d{1,2})?$)|(^[0]{1}(\.\d{1,2})?$)/,

    //账号
    account: /^[A-Za-z0-9@_-]{4,20}$/,
    //密码
    pwd: /^[A-Za-z0-9~！@#￥%^&*()+-=.]{6,20}$/,
};

//日期
Date.prototype.Format = function (fmt) { //author: meizz
    var o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "h+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}